#ifndef __UASART_H
#define __UASART_H

#include "user_global.h"
#include "usart.h"

//------------------------------------------
// 异常应答代码
//------------------------------------------
#define ILLEGAL_FUNCTION            0x01
#define ILLEGAL_DATA_ADDRESS        0x02
#define ILLEGAL_DATA_VALUE          0x03
#define SERVER_DEVICE_FAILURE       0x04
#define ACKNOWLEDGE                 0x05
#define SERVER_DEVICE_BUSY          0x06
#define MEMORY_PARITY_ERROR         0x08
#define GATEWAY_PATH_UNAVAILABLE    0x0A
#define GATEWAY_TARGET_NO_RESPONSE  0x0B

//将多字节数转换为小端模式
extern ushort from_little_endian_16(ushort n);
//将多字节数转换为小端模式
extern ulong from_little_endian_32(ulong n);

#define UART0_BUF_SIZE      128     // 一定是2^n
#define UART0_BUF_MASK      (UART0_BUF_SIZE-1)

extern uchar  uart0_tx_buf[UART0_BUF_SIZE];         // uart1发送缓冲区

#define UART0_START()                                   uart0_tx_ptr = uart0_tx_buf
#define UART0_APPEND(type, val)                         ((*(type *)&uart0_tx_ptr[0])) = (val);  uart0_tx_ptr +=sizeof(type)
#define UART0_END()                                     uart0_tx_len = uart0_tx_ptr - uart0_tx_buf

extern uchar  REN0;                              // 串口0接收使能

extern uchar  uart0_dr;                         // uart1要发送长度
extern uchar  uart0_len;                        // uart0已接收/或要发送长度
extern uchar  uart0_buf[UART0_BUF_SIZE];        // uart0发送/接收缓冲区
extern ushort  uart0_timestamp;                 // 最后接收时间
extern uchar *uart0_tx_ptr;                     // 发送指针
extern bit uart0_rx_pending;                    // uart0正在接收标志
extern bit uart0_tx_pending;                    // uart0正在发送标志
extern uchar  uart0_tx_len;                     // uart1要发送长度

extern HAL_StatusTypeDef USART0_Send_Date(uchar *data,uchar number);
extern void USART0_Puts(char *str);

extern void USART1_Delay_Send(uchar *data,uchar number);
extern HAL_StatusTypeDef USART1_Send_Date(uchar *data,uchar number);
extern void USART2_Send_Date(uchar *data,uchar number);
extern void USART1_Puts(char * str);
extern void USART1_Putc(unsigned char c);

#ifdef _SCANNER_USES_UART1
#define UART1_BUF_SIZE      UART0_BUF_SIZE          // 一定是2^n
#define UART1_BUF_MASK      (UART1_BUF_SIZE-1)
extern uchar  REN1;                                 // 串口0接收使能
extern uchar uart1_dr;
extern uchar  uart1_tx_len;                         // uart1要发送长度
extern uchar  uart1_tx_left;                        // uart1发送剩余长度
extern uchar  uart1_rx_len;                         // uart1已接收长度
extern uchar  uart1_tx_buf[UART1_BUF_SIZE];         // uart1发送缓冲区
extern uchar  uart1_rx_buf[UART1_BUF_SIZE];         // uart1接收缓冲区
extern ulong uart1_timestamp;                       // 最后接收时间
extern ulong uart1_timestamp_long;                  // 最后发送时间
extern uchar * uart1_tx_ptr;                        // 发送指针
extern uchar uart1_retry_times;                     // uart1重试次数
extern uchar uart1_result;                          // uart1通讯结果, 见UART1_RESULT_xxx
extern bit uart1_rx_pending;                        // uart1正在接收标志
extern bit uart1_tx_pending;                        // uart1正在发送标志
extern bit uart1_locked;                            // uart1访问锁定

// 通讯结果
#define UART1_RESULT_OK                             0
#define UART1_RESULT_TIMEOUT                        1
#define UART1_RESULT_CRC                            2
#define UART1_RESULT_EXCEPTION                      3

#define UART1_START()                               uart1_tx_ptr = uart1_tx_buf
#define UART1_APPEND(type, val)                     ((*(type *)&uart1_tx_ptr[0])) = (val); uart1_tx_ptr +=sizeof(type)
#define UART1_END()                                  uart1_tx_len = uart1_tx_ptr - uart1_tx_buf

void Uart1_Send(void);


#endif//_USES_UART1

bit Uart0_FrameEnded(void);
bit Uart1_FrameEnded(void);
void Modbus_Gateway(void);
void Modbus_Transparent(void);
bit Uart0_Send_Message(void);

#endif
